﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace Gismeteo3
{
    internal class ForecastInfo : IComparable
    {
        Regex iconRe = new Regex("(([d|n])\\.)((sun|moon)\\.)(c(\\d{1})\\.)*((s|r)(\\d{1})\\.)*((st)\\.)*$", RegexOptions.IgnoreCase);

        public DateTime dt { get; private set; }
        public String img { get; private set; }
        public String desc { get; private set; }
        public Int32 temp { get; private set; }

        public ForecastInfo(String img) { this.img = img;  }
        public ForecastInfo(DateTime dt, String img, String desc, Int32 temp) { this.dt = dt; this.img = img; this.desc = desc; this.temp = temp;  }

        public String Cloud
        {
            get
            {
                return desc.Split(',')[0].Trim();
            }
        }
        public String Precipitation
        {
            get
            {
                return desc.Split(',').Length > 1 ? desc.Split(',')[1].Trim() : String.Empty;
            }
        }
        public String Thunderstorm
        {
            get
            {
                return desc.Split(',').Length > 2 ? desc.Split(',')[2].Trim() : String.Empty;
            }
        }

        public Int32 Cl
        {
            get
            {
                if (!String.IsNullOrEmpty(iconRe.Match(img + ".").Groups[6].Value))
                    return Convert.ToInt32(iconRe.Match(img + ".").Groups[6].Value);
                return 0;
            }
        }
        public Int32 PrT
        {
            get
            {
                if (!String.IsNullOrEmpty(iconRe.Match(img + ".").Groups[8].Value))
                    return iconRe.Match(img + ".").Groups[8].Value.ToLower() == "r" ? 1 : 2;
                return 0;
            }
        }
        public Int32 Pr
        {
            get
            {
                if (!String.IsNullOrEmpty(iconRe.Match(img + ".").Groups[9].Value)) 
                    return Convert.ToInt32(iconRe.Match(img + ".").Groups[9].Value); 
                return 0;
            }
        }
        public Boolean Th { get { return !String.IsNullOrEmpty(iconRe.Match(img + ".").Groups[11].Value); } }

        public Int32 SkyCode 
        {
            get 
            {
                return GetWeatherPic(); 
            } 
        }

        public int CompareTo(object obj)
        {
            if (obj is ForecastInfo) return this.dt.CompareTo((obj as ForecastInfo).dt);
            throw new ArgumentException("Object is not a " + this.GetType().Name);
        }

        public bool CompareImg(String IMG)
        {
            String IMG0 = IMG + ".";
            String img0 = img + ".";
            for (int i = 5; i < iconRe.Match(IMG0).Groups.Count; i++)
                if (iconRe.Match(IMG0).Groups[i].Value != iconRe.Match(img0).Groups[i].Value)
                    return false;
            return true;
        }

        #region GetWeatherPic
        private int GetWeatherPic()
        {
            try
            {
                string icon = this.img + ".";
                //Regex iconRe = new Regex("(([d|n])\\.)((sun|moon)\\.)(c(\\d{1})\\.)*((s|r)(\\d{1})\\.)*((st)\\.)*", RegexOptions.IgnoreCase);
                Boolean isDay = false;
                Int32 cloud = 0;
                Int32 precipType = 0; //0 -дождь, 2 - снег
                Int32 precipitation = 0;
                Boolean ts = false;
                if (iconRe.IsMatch(icon))
                {
                    isDay = iconRe.Match(icon).Groups[2].Value.ToLower() == "d";
                    if (!String.IsNullOrEmpty(iconRe.Match(icon).Groups[6].Value))
                        cloud = Convert.ToInt32(iconRe.Match(icon).Groups[6].Value.ToLower());
                    if (!String.IsNullOrEmpty(iconRe.Match(icon).Groups[9].Value))
                        precipitation = Convert.ToInt32(iconRe.Match(icon).Groups[9].Value.ToLower());
                    precipitation = iconRe.Match(icon).Groups[11].Value.ToLower() != String.Empty ? 4 : precipitation;
                    precipType = iconRe.Match(icon).Groups[8].Value.ToLower() == "s" ? 2 : precipType;
                    Int32 code = cloud * 100 + precipitation * 10 + precipType;
                    //Облачность 0-Ясно, 1-Небольшая облачность, 2-Переменная облачность, 3-Облачно с прояснениями, 4-Облачно
                    //Сила осадков 0-нет, 1-слабый, 2-тип, 3-сильный, 4-гроза
                    //Тип осадков 0-дождь,1-осадки 2-снег
                    isDay = icon.ToLower()[0] == 'd';
                    switch (code)
                    {
                        case 0: return isDay ? 1 : 33; //Ясно
                        case 100: return isDay ? 2 : 34; //Небольшая облачность
                        case 200: return isDay ? 3 : 35; //Переменная облачность
                        case 210: return isDay ? 14 : 39; //Переменная облачность, слабый дождь
                        case 211: return isDay ? 26 : 26; //Переменная облачность, слабые осадки
                        case 212: return isDay ? 21 : 44; //Переменная облачность, слабый снег
                        case 220: return isDay ? 14 : 39; //Переменная облачность, дождь
                        case 221: return isDay ? 26 : 26; //Переменная облачность, осадки
                        case 222: return isDay ? 20 : 43; //Переменная облачность, снег
                        case 240: return isDay ? 17 : 41; //Переменная облачность, гроза
                        case 300: return isDay ? 6 : 38; //Облачно с прояснениями
                        case 310: return isDay ? 13 : 40; //Облачно с прояснениями, слабый дождь
                        case 311: return isDay ? 26 : 26; //Облачно с прояснениями, слабый осадки
                        case 312: return isDay ? 21 : 44; //Облачно с прояснениями, слабый снег
                        case 320: return isDay ? 13 : 40; //Облачно с прояснениями, дождь
                        case 321: return isDay ? 26 : 26; //Облачно с прояснениями, осадки
                        case 322: return isDay ? 20 : 43; //Облачно с прояснениями, снег
                        case 340: return isDay ? 16 : 42; //Облачно с прояснениями, гроза
                        case 400: return isDay ? 7 : 8; //Облачно
                        case 410: return isDay ? 12 : 12; //Облачно, слабый дождь
                        case 411: return isDay ? 26 : 26; //Облачно, слабый осадки
                        case 412: return isDay ? 24 : 24; //Облачно, слабый снег
                        case 420: return isDay ? 12 : 12; //Облачно, дождь
                        case 421: return isDay ? 26 : 26; //Облачно, осадки
                        case 422: return isDay ? 19 : 19; //Облачно, снег
                        case 430: return isDay ? 18 : 18; //Облачно, сильный дождь
                        case 431: return isDay ? 26 : 26; //Облачно, сильные осадки
                        case 432: return isDay ? 22 : 22; //Облачно, сильный снег
                        case 440: return isDay ? 15 : 15; //Облачно, гроза
                        default: return 1;
                    }
                }
                return 1;
            }
            catch { return 1; }
        }
        #endregion
    }
}
